// ----------------------------------
// RSDK Project: Sonic Essence
// Script Description: Soul Octopoid Rocket
// Script Author: Tails LP
// ----------------------------------

//-------Aliases-------//

//States

private alias 0 : ROCKET_START
private alias 1 : ROCKET_LAUNCH
private alias 2 : ROCKET_OFFSCREEN
private alias 3 : ROCKET_DESEND
private alias 4 : ROCKET_EXPLOSION
private alias 5 : ROCKET_STUCKINGROUND
private alias 6 : ROCKET_ROTATEANDEXPLODE
private alias 7 : END_TEASER




private alias object.value0 : rocket.timer
private alias object.value1 : frame.timer
private alias object.value2 : rocket.offsetTimer
private alias object.value3 : outerTarget.frame
private alias object.value4 : innerTarget.frame
private alias object.value5 : innerTarget.frameTimer

private alias object.value38 : player.hitboxLeft
private alias object.value39 : player.hitboxRight
private alias object.value40 : player.hitboxTop
private alias object.value41 : player.hitboxBottom


public value flash.direction = 0;

//-------Function declarations-------//

//-------Static Values-------//


//-------Tables-------//


//-------Functions-------//

function Rocket_DebugDraw
	DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
end function


function Rocket_DebugSpawn
	CreateTempObject(TypeName[Soul Octopoid Rocket], 0, object.xpos, object.ypos)
	object[tempObjectPos].frame = 3

	
end function


event ObjectMain
	
	switch object.state
	case ROCKET_START
		object.state = ROCKET_LAUNCH
		break
	case ROCKET_LAUNCH
		object.ypos += object.yvel
		object.yvel -= 0x1000
		
		temp0 = screen.yoffset
		temp0 -= 64
		if object.iypos <= temp0
			object.state = ROCKET_OFFSCREEN
		endif
		break
	case ROCKET_OFFSCREEN
		object.rotation = 256
		rocket.timer ++
		if rocket.timer > rocket.offsetTimer
			object.state = ROCKET_DESEND
			rocket.timer = 0
		endif
		break
	case ROCKET_DESEND
		object.ypos += object.yvel
		object.yvel = 0x30000
		
		if object.propertyValue == 1
			ObjectTileGrip(CSIDE_FLOOR, -4, 4, PATH_A)
			temp0 = checkResult	
			ObjectTileGrip(CSIDE_FLOOR, -4, 4, PATH_B)
			temp0 |= checkResult
		else
			ObjectTileGrip(CSIDE_FLOOR, -4, -4, PATH_A)
			temp0 = checkResult	
			ObjectTileGrip(CSIDE_FLOOR, -4, -4, PATH_B)
			temp0 |= checkResult
		endif
		
		if temp0 == TRUE
			if object.propertyValue == 1
				PlaySfx(SfxName[Octo Missile Stuck], false)
				object.state = ROCKET_STUCKINGROUND
				//object.alpha = 255
			else
				object.type = TypeName[Blank Object]
				PlaySFX(SFXName[Explosion], 0)
				temp1 = object.ypos
				temp1 -= 0x80000
				CreateTempObject(TypeName[Explosion], 0, object.xpos, temp1)
			endif
		endif
		
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			BoxCollisionTest(C_TOUCH, object.entityPos, -5, -25, 5, 25, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
			if checkResult == TRUE
				CallFunction(PlayerObject_Hit)
			endif
		next
		break
	case ROCKET_STUCKINGROUND
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			BoxCollisionTest(C_TOUCH, object.entityPos, -5, -25, 5, 25, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
			if checkResult == TRUE
				CheckEqual(object[currentPlayer].animation, ANI_JUMPING)
				if checkResult == TRUE
					object.direction = object[currentPlayer].direction
					foreach (TypeName[Soul Octopoid Body], arrayPos0, ALL_ENTITIES)
					next
					object.state = ROCKET_ROTATEANDEXPLODE
					object.yvel = -0x80000
				endif
			endif
		next
		break
	case ROCKET_ROTATEANDEXPLODE
		object.rotation += 36
		object.yvel += 0x4000
		object.ypos += object.yvel
		if object.direction == 0
			object.xpos += 0x20000
		else
			object.xpos -= 0x20000
		endif
		if object.outOfBounds == true
			object.value6 = 0
			object.state = END_TEASER
		end if
		break
	case END_TEASER
		SetScreenFade(0, 0, 0, object.value6)
		object.value6 += 2
		music.volume -= 2
		if object.value6 >= 256
			stage.activeList = PRESENTATION_STAGE
			stage.listPos = 0
			LoadStage()
		endif
		break
	endswitch


end event

event ObjectDraw
	switch object.state
	case ROCKET_START
		
		frame.timer ++
		if frame.timer > 5
			object.frame ++
			if object.frame > 5
				object.frame = 5
				object.state ++
			endif
			frame.timer = 0
		endif
		break
		
	case ROCKET_LAUNCH
		frame.timer ++
		if frame.timer > 3
			object.frame ++
			outerTarget.frame ++
			if object.frame > 2
				object.frame = 0
				outerTarget.frame = 0
			endif
			frame.timer = 0
		endif
		
		innerTarget.frameTimer ++
		if innerTarget.frameTimer > 3
			innerTarget.frame ++
			if innerTarget.frame > 1
				innerTarget.frame = 0
			endif
			innerTarget.frameTimer = 0
		endif
		break

	case ROCKET_DESEND
		
		frame.timer ++
		if frame.timer > 3
			object.frame ++
			outerTarget.frame ++
			if object.frame > 2
				PlaySfx(SfxName[Octo Lock On], false)
				object.frame = 0
				outerTarget.frame = 0
			endif
			frame.timer = 0
		endif
		
		innerTarget.frameTimer ++
		if innerTarget.frameTimer > 3
			innerTarget.frame ++
			if innerTarget.frame > 1
				innerTarget.frame = 0
			endif
			innerTarget.frameTimer = 0
		endif
		break
		
	case ROCKET_STUCKINGROUND
		
		frame.timer ++
		if frame.timer > 3
			object.frame ++
			if object.frame > 2
				object.frame = 0
			endif
			frame.timer = 0
		endif
	
		object.inkEffect = INK_ALPHA
	
		if flash.direction == 0
			if object.alpha > 0
				object.alpha -= 8
			else
				flash.direction ^= 1
			endif
		else
			if object.alpha < 255
				object.alpha += 8
			else
				flash.direction ^= 1
			endif
		endif
			
		break
	endswitch
	
	temp0 = object.frame
	if object.propertyValue == 1
		temp0 += 6
	endif
	DrawSpriteFX(temp0, FX_ROTATE, object.xpos, object.ypos)
		
	if object.state ==  ROCKET_STUCKINGROUND
		DrawSpriteFX(17, FX_INK, object.xpos, object.ypos)
	endif
	
	
	switch object.state
	case ROCKET_DESEND
		temp3 = outerTarget.frame
		temp3 += 12
		temp2 = stage.curYBoundary2
		temp2 -= 64
		temp2 *= 65536
		DrawSpriteFX(temp3, FX_ROTATE, object.xpos, temp2)
		
		temp3 = innerTarget.frame
		temp3 += 15
		DrawSpriteFX(temp3, FX_ROTATE, object.xpos, temp2)
		break
	endswitch
end event

event ObjectStartup
    LoadSpriteSheet("SSZ/Objects2.gif")
	SpriteFrame(-5, -25, 11, 50, 289, 1)			//0 Rocket Launched 1
	SpriteFrame(-5, -25, 11, 50, 301, 1)			//1 Rocket Launched 2
	SpriteFrame(-5, -25, 11, 50, 313, 1)			//2 Rocket Launched 3
	
	SpriteFrame(-5, -25, 11, 50, 265, 1)			//3 Rocket Start 1
	SpriteFrame(-5, -25, 11, 50, 277, 1)			//4 Rocket Start 2
	SpriteFrame(-5, -25, 11, 50, 289, 1)			//5 Rocket Launched 1
	
	SpriteFrame(-5, -25, 11, 50, 349, 1)			//9 Red Rocket Start 1
	SpriteFrame(-5, -25, 11, 50, 361, 1)			//10 Red Rocket Start 2
	SpriteFrame(-5, -25, 11, 50, 373, 1)			//11 Red Rocket Launched 1
	
	SpriteFrame(-5, -25, 11, 50, 325, 1)			//6 Red Rocket Launched 1
	SpriteFrame(-5, -25, 11, 50, 337, 1)			//7 Red Rocket Launched 2
	SpriteFrame(-5, -25, 11, 50, 349, 1)			//8 Red Rocket Launched 3
	
	SpriteFrame(-14, -14, 28, 29, 265, 100)			//12 Impact Indicator Outer Ring 1
	SpriteFrame(-14, -14, 28, 29, 265, 130)			//13 Impact Indicator Outer Ring 2
	SpriteFrame(-14, -14, 28, 29, 265, 160)			//14 Impact Indicator Outer Ring 3
	
	SpriteFrame(-8, -8, 16, 17, 294, 100)			//15 Impact Indicator Inner Ring 1
	SpriteFrame(-8, -8, 16, 17, 294, 118)			//16 Impact Indicator Inner Ring 2
	
	
	SpriteFrame(-5, -25, 11, 50, 385, 1)				//17 Flashing Rocket

		
	SetTableValue(TypeName[Soul Octopoid Rocket], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(Rocket_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(Rocket_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
	DebugMode_ObjCount++	
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 223, 172)
end event